#ifndef LOG_H
#define LOG_H

#include <stdio.h>

// 定义日志等级
#define LOG_LEVEL_DEBUG 0
#define LOG_LEVEL_INFO 1
#define LOG_LEVEL_WARN 2
#define LOG_LEVEL_ERROR 3

// 默认日志等级，比如设置为INFO，即只打印INFO、WARN和ERROR级别的日志
#define DEFAULT_LOG_LEVEL LOG_LEVEL_DEBUG

// ANSI 颜色代码
#define ANSI_COLOR_BLUE "\x1b[94m"
#define ANSI_COLOR_LIGHT_GREEN "\x1b[92;1m"   // 浅绿色（亮）
#define ANSI_COLOR_BRIGHT_YELLOW "\x1b[93;1m" // 亮黄色
#define ANSI_COLOR_RED "\x1b[91m"
#define ANSI_COLOR_RESET "\x1b[0m"

// 判断当前是否应该打印日志的宏
#define SHOULD_LOG(level) ((level) >= DEFAULT_LOG_LEVEL)

// without color
#define LOG_INTERNAL(level, color, format, ...)                                \
    do                                                                         \
    {                                                                          \
        if (SHOULD_LOG(level))                                                 \
        {                                                                      \
            printf("[%s]", #level);                                            \
            printf(format, ##__VA_ARGS__);                                     \
            printf("\n");                                                      \
        }                                                                      \
    } while (0)

// 为不同日志等级定义单独的宏，并为每个级别分配一个颜色
#define LOG_DEBUG(format, ...)                                                 \
    LOG_INTERNAL(LOG_LEVEL_DEBUG, ANSI_COLOR_BLUE, format, ##__VA_ARGS__)
#define LOG_INFO(format, ...)                                                  \
    LOG_INTERNAL(LOG_LEVEL_INFO, ANSI_COLOR_LIGHT_GREEN, format, ##__VA_ARGS__)
#define LOG_WARN(format, ...)                                                  \
    LOG_INTERNAL(LOG_LEVEL_WARN, ANSI_COLOR_BRIGHT_YELLOW, format,             \
                 ##__VA_ARGS__)
#define LOG_ERROR(format, ...)                                                 \
    LOG_INTERNAL(LOG_LEVEL_ERROR, ANSI_COLOR_RED, format, ##__VA_ARGS__)

#endif // LOG_H
